/**
 * @fileOverview 文件属性封装
 */



var Base = require('./base');
var Mediator = require('./mediator');
var $ = Base.$, idPrefix = 'WU_FILE_', idSuffix = 0, rExt = /\.([^.]+)$/, statusMap = {};
function gid() {
    return idPrefix + idSuffix++;
}
/**
     * 文件类
     * @class File
     * @constructor 构造函数
     * @grammar new File( source ) => File
     * @param {Lib.File} source [lib.File](#Lib.File)实例, 此source对象是带有Runtime信息的。
     */
function WUFile(source) {
    /**
         * 文件名，包括扩展名（后缀）
         * @property name
         * @type {string}
         */
    this.name = source.name || 'Untitled';
    /**
         * 文件体积（字节）
         * @property size
         * @type {uint}
         * @default 0
         */
    this.size = source.size || 0;
    /**
         * 文件MIMETYPE类型，与文件类型的对应关系请参考[http://t.cn/z8ZnFny](http://t.cn/z8ZnFny)
         * @property type
         * @type {string}
         * @default 'application/octet-stream'
         */
    this.type = source.type || 'application/octet-stream';
    /**
         * 文件最后修改日期
         * @property lastModifiedDate
         * @type {int}
         * @default 当前时间戳
         */
    this.lastModifiedDate = source.lastModifiedDate || new Date() * 1;
    /**
         * 文件ID，每个对象具有唯一ID，与文件名无关
         * @property id
         * @type {string}
         */
    this.id = gid();
    /**
         * 文件扩展名，通过文件名获取，例如test.png的扩展名为png
         * @property ext
         * @type {string}
         */
    this.ext = rExt.exec(this.name) ? RegExp.$1 : '';
    /**
         * 状态文字说明。在不同的status语境下有不同的用途。
         * @property statusText
         * @type {string}
         */
    this.statusText = '';
    // 存储文件状态，防止通过属性直接修改
    statusMap[this.id] = WUFile.Status.INITED;
    this.source = source;
    this.loaded = 0;
    this.on('error', function (msg) {
        this.setStatus(WUFile.Status.ERROR, msg);
    });
}
$.extend(WUFile.prototype, {
    /**
         * 设置状态，状态变化时会触发`change`事件。
         * @method setStatus
         * @grammar setStatus( status[, statusText] );
         * @param {File.Status|String} status [文件状态值](#WebUploader:File:File.Status)
         * @param {String} [statusText=''] 状态说明，常在error时使用，用http, abort,server等来标记是由于什么原因导致文件错误。
         */
    setStatus: function (status, text) {
        var prevStatus = statusMap[this.id];
        typeof text !== 'undefined' && (this.statusText = text);
        if (status !== prevStatus) {
            statusMap[this.id] = status;
            /**
                 * 文件状态变化
                 * @event statuschange
                 */
            this.trigger('statuschange', status, prevStatus);
        }
    },
    /**
         * 获取文件状态
         * @return {File.Status}
         * @example
                 文件状态具体包括以下几种类型：
                 {
                     // 初始化
                    INITED:     0,
                    // 已入队列
                    QUEUED:     1,
                    // 正在上传
                    PROGRESS:     2,
                    // 上传出错
                    ERROR:         3,
                    // 上传成功
                    COMPLETE:     4,
                    // 上传取消
                    CANCELLED:     5
                }
         */
    getStatus: function () {
        return statusMap[this.id];
    },
    /**
         * 获取文件原始信息。
         * @return {*}
         */
    getSource: function () {
        return this.source;
    },
    destroy: function () {
        this.off();
        delete statusMap[this.id];
    }
});
Mediator.installTo(WUFile.prototype);
/**
     * 文件状态值，具体包括以下几种类型：
     * * `inited` 初始状态
     * * `queued` 已经进入队列, 等待上传
     * * `progress` 上传中
     * * `complete` 上传完成。
     * * `error` 上传出错，可重试
     * * `interrupt` 上传中断，可续传。
     * * `invalid` 文件不合格，不能重试上传。会自动从队列中移除。
     * * `cancelled` 文件被移除。
     * @property {Object} Status
     * @namespace File
     * @class File
     * @static
     */
WUFile.Status = {
    INITED: 'inited',
    // 初始状态
    QUEUED: 'queued',
    // 已经进入队列, 等待上传
    PROGRESS: 'progress',
    // 上传中
    ERROR: 'error',
    // 上传出错，可重试
    COMPLETE: 'complete',
    // 上传完成。
    CANCELLED: 'cancelled',
    // 上传取消。
    INTERRUPT: 'interrupt',
    // 上传中断，可续传。
    INVALID: 'invalid'    // 文件不合格，不能重试上传。
};
module.exports = WUFile || module.exports;;